#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

using namespace std;

int cnt = 0;

void handler(int signo)
{
    cout << "我是一个进程，刚刚获取了一个信号: " << signo << endl;
    // exit(1);
}

static void showPending(sigset_t *pendings)
{
    for(int sig = 1; sig <= 31; ++sig)
    {
        if(sigismember(pendings, sig))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }

    cout << endl;
}

int main()
{
    cout << "pid: " << getpid() << endl;
    // 3.屏蔽2号信号
    sigset_t bsig, obsig;
    sigemptyset(&bsig);
    sigemptyset(&obsig);
    // // 3.1添加2号信号到信号屏蔽字中
    // sigaddset(&bsig, 2);

    // 全屏蔽
    for(int sig = 1; sig <= 31; ++sig)
    {
        sigaddset(&bsig, sig);
        signal(sig, handler);
    }

    // 3.2设置用户级的信号屏蔽字到内核中，让当前进程屏蔽到2号信号
    sigprocmask(SIG_SETMASK, &bsig, &obsig);

    // 2.signal
    // signal(2, handler);
    // 1.不断的获取当前进程的pending信号集
    sigset_t pendings;
    while(true)
    {
        // 1.1 清空信号集
        sigemptyset(&pendings);
        // 1.2 获取当前进程(谁调用，获取谁)的pending信号集
        if(sigpending(&pendings) == 0)
        {
            // 1.3 打印当前进程的pending信号集
            showPending(&pendings);
        }
        sleep(1);
        
        ++cnt;
        if(cnt == 20)
        {
            cout << "解除对2号信号的block..." << endl;
            sigset_t sigs;
            sigemptyset(&sigs);
            sigaddset(&sigs, 2);
            sigprocmask(SIG_UNBLOCK, &sigs, nullptr);
        }
    }

    return 0;
}
